/*********************************************************************************
 *      Copyright:  (C) 2025 LingYun IoT System Studio
 *                  All rights reserved.
 *
 *       Filename:  pipe.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(26/03/25)
 *         Author:  Guo Wenxue <guowenxue@gmail.com>
 *      ChangeLog:  1, Release initial version on "26/03/25 21:22:25"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

#define MSG_STR	"This message is from parent: Hello, child process!"

int main(int argc, char **argv)
{
	int			pipe_fd[2];
	int			rv;
	int			pid;
	char		buf[1024];
	int			wstatus;

	if(pipe(pipe_fd) < 0)
	{
		printf("Create child process failure: %s\n", strerror(errno));
		return -2;
	}

	if( (pid=fork()) < 0 )
	{
		printf("Create child process failure: %s\n", strerror(errno));
		return -2;
	}
	else if(pid == 0)
	{
		/*  child process close write endpoint, then read data from parent process */
		close(pipe_fd[1]);
		
		memset(buf, 0, sizeof(buf));
		rv=read(pipe_fd[0], buf, sizeof(buf));
		if(rv < 0 )
		{
			printf("Child process read from pipe failure: %s\n", strerror(errno));
			return -3;
		}
		
		printf("Child process read %d bytes data from pipe: \"%s\"\n", rv, buf);
		return 0;
	}
	
	/*  parent process close read endpoint, then write data to child process */
	close(pipe_fd[0]);
	if(write(pipe_fd[1], MSG_STR, strlen(MSG_STR))< 0)
	{
		printf("Parent process write data to pipe failure: %s\n", strerror(errno));
		return -3;
	}
	
	printf("Parent start wait child process exit...\n");
	wait(&wstatus);
	
	return 0;
}


